#ifndef DATAMONITOR_H
#define DATAMONITOR_H

#include <QWidget>
#include <QSqlTableModel>
#include <QtCharts>
#include <QSerialPort>
#include <QSerialPortInfo>
#include "alertmanager.h"
#include "logmanager.h"

QT_CHARTS_USE_NAMESPACE

namespace Ui {
class DataMonitor;
}

class DataMonitor : public QWidget
{
    Q_OBJECT

public:
    explicit DataMonitor(QWidget *parent = nullptr);
    ~DataMonitor();

    void setAlertManager(AlertManager *alertManager);
    void setCurrentUserId(int userId);

    // 新增:对外提供的控制接口
    void sendDeviceControl(const QString &deviceType, int deviceId,
                          const QString &action, const QJsonObject &params = QJsonObject());

private slots:
    void onStartMonitor();
    void onQueryHistory();
    void onGenerateChart();
    void onDeviceSelectionChanged(int index);
    void onRefreshDeviceList();
    void updateRealTimeData();

    // 串口相关槽函数
    void onOpenSerialPort();
    void onCloseSerialPort();
    void onSerialDataReceived();
    void onSerialErrorOccurred(QSerialPort::SerialPortError error);
    void onBaudRateChanged(int index);
//    void processSerialBuffer();

    // 图表实时更新槽函数
    void updateChartWithNewData();
    void onStopChartUpdate();

private:
    Ui::DataMonitor *ui;
    QSqlTableModel *historyModel;
    QChart *chart;
    QChartView *chartView;
    QTimer *monitorTimer;
    AlertManager *alertManager;
    int currentUserId;

    // 串口相关成员变量
    QSerialPort *serialPort;
    QTimer *serialDataTimer;
    bool isSerialConnected;

    // 图表实时更新相关变量
    QTimer *chartUpdateTimer;
    QLineSeries *currentSeries;
    int currentChartDeviceId;
    QString currentChartDataType;
    QDateTime lastChartUpdateTime;
    bool isChartMonitoring;

    void setupUI();
    void setupConnections();
    void loadDeviceList();
    void setupHistoryModel();
    void setupChart();
    void applyUserPermissions();

    // 串口相关函数
    void setupSerialPort();
    void refreshSerialPorts();
    void parseSerialData(const QByteArray &data);
    void saveSerialDataToDatabase(const QVariantMap &sensorData);

    // 图表更新相关函数
    void appendDataToChart(const QDateTime &timestamp, double value);
    QString getFieldNameFromDataType(const QString &dataType);
    void adjustChartAxes();
    void updateChartTitle();

    QByteArray serialDataBuffer;
    void processSerialBuffer();

    QByteArray m_serialBuffer;

signals:
    // ✅ 新增：传感器数据更新信号
    void sensorDataUpdated(const QVariantMap &sensorData);
};

#endif // DATAMONITOR_H
